package com.gyx.lottery.common.utils;


import cn.hutool.jwt.JWT;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.JwtParserBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import javax.crypto.SecretKey;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JWTUtil {
    /**
     * 日志
     */
    private static final Logger logger= LoggerFactory.getLogger(JWTUtil.class);
    /**
     * 密钥：Base64密钥
     */
    private static final String SECRET="acsckbskgcgdjgckacbjvjvjvhvshavxhavnvanxvbsaaa";
    /**
     * 生成安全密钥，并使用base64解码并创建一个HMAC SHA密钥
     */
    private static final SecretKey SECRET_KEY= Keys.hmacShaKeyFor
            (Decoders.BASE64.decode(SECRET));
    /**
     * 过期时间(单位：ms）
     */
    private static final long EXPIRATION=60*60*1000;
    /**
     * 生成密钥，
     * claim {"id":12,"name":"张三"}
     */
    public  static String getJWT(Map<String,Object> claim){
        String code = Jwts.builder()
                .setClaims(claim)//设置数据
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))//设置过期
                .setIssuedAt(new Date())//签发日期
                .signWith(SECRET_KEY)//设置密钥
                .compact();
        return code;
    }
    /**
     * 解析密钥
     */
    public static Claims parseJWT(String jwt){
        if(!StringUtils.hasLength(jwt)){
            return null;
        }
        JwtParserBuilder parserBuilder = Jwts.parserBuilder().setSigningKey(SECRET_KEY);
        Claims claims=null;
        try {
         claims = parserBuilder.build().parseClaimsJws(jwt).getBody();
        }
        catch (Exception e){
            logger.error("parseJWT失败:{}",jwt,e);
        }
        return claims;

    }
    /**
     * 从token中返回id
     */
public static Integer getId(String jwt){
    Claims claims = parseJWT(jwt);
    if(claims!=null){
        HashMap<String,Object>map=new HashMap<>(claims);
        return (Integer)map.get("userId");
    }
    return null;
}
}
